/*
 * Asucar
 * Sabroson
 */


import java.util.ArrayList;
import java.util.Map;
import java.util.Iterator;
import java.util.HashMap;
import java.util.Stack;

/**
 *
 * @author sempere
 */
/*
package pl;
*/
public class TSimbolos {

   HashMap<String, Simbolo>simbolos = 
		new HashMap<String, Simbolo>();
   
   TSimbolos tablaPadre = null;
   Simbolo simboloPadre = null;
   public static int numSimbolos = 0;
   public static int saltos = 0;
   public static Stack<String[]> bucles = new Stack<String[]>();



    public TSimbolos(TSimbolos tablaPadre, Simbolo simboloPadre) {

        this.tablaPadre = tablaPadre;
        this.simboloPadre = simboloPadre;
	
    }

    public TSimbolos pop() {
        return tablaPadre;
    }

    public int nuevo(String nombre, Simbolo.TipoRetorno tipo, Simbolo.ClaseDato clase){

	/*System.err.println("**** Añadiendo simbolo " + nombre);
	for(Simbolo s : simbolos.values()){
		System.err.println(s.nombre);
	}*/

     if(existe(nombre)){
	return -1;
     }

     Simbolo S = new Simbolo(nombre,tipo,clase,this,numSimbolos++); 
     //S.num-=1;
     simbolos.put(nombre,S); 

     return S.num;
     
}

    public int nuevo(String nombre, Simbolo.TipoRetorno tipo,int dims){
	/*
	System.err.println("**** Añadiendo simbolo " + nombre);
	for(Simbolo s : simbolos.values()){
		System.err.println(s.nombre);
	}*/
     if(existe(nombre)){
	return -1;
     }
 
     Simbolo S = new Simbolo(nombre,tipo,Simbolo.ClaseDato.VECTOR,this, dims,numSimbolos++);
     //S.num-=1;
     simbolos.put(nombre,S); 
     return S.num;
    }

   public void nuevoAPelo(Simbolo s){

	/*System.err.println("**** Añadiendo simbolo " + s.nombre);
	for(Simbolo ss : simbolos.values()){
		System.err.println(ss.nombre);
	}*/


     s.tabla = this;
     simbolos.put(s.nombre,s); 
    }

    public static String limpiaLocals(String locals){
    
   		while(locals.length()>0 && 
   		(locals.charAt(locals.length()-1)==',' || locals.charAt(locals.length()-1)==' ')){
   			locals = locals.substring(0,locals.length()-1);	
   		}
   	
   		return locals;
    	
    	
    	
    	
    }
    public Simbolo busca(String nombre) {
        Simbolo s = simbolos.get(nombre);
        if (s != null) {
            return s;  
        }
        if (tablaPadre != null) {
            return tablaPadre.busca(nombre);
        }
        return null; 
    }

    public boolean existe(String nombre) {
        return simbolos.get(nombre) != null;
    } 

    public boolean existe(Simbolo sim) {
	Simbolo snuevo = simbolos.get(sim.nombre);
	if(snuevo == null){
		return false;
	}
	if(sim.clase != snuevo.clase){
		return false;
	} else {
		if(sim.clase == Simbolo.ClaseDato.METODO && sim.params.size()!=snuevo.params.size()){
			return false;
		}
	}
	return true;
    }
			
 

    public void pintaSimbolos() {

       for(Simbolo s : simbolos.values()){
		System.err.println(s.nombre + " " + s.num);
	}
	if(tablaPadre!=null){
		tablaPadre.pintaSimbolos();
	}
	System.err.println("END");
    }

    
    public static void apila(String etiquetaInicio, String etiquetaFin){
	String[] par = new String[2];
	par[0] = etiquetaInicio;
	par[1] = etiquetaFin;
	bucles.push(par);
    }

    public static String[] desapila(){
	return bucles.pop();
    }

    public static String[] desapilaSuave(){
	return bucles.peek();
    }

    public static boolean isVacia(){
	return bucles.empty();
    }
 
}
